package com.android.demo;

import java.lang.reflect.Method;

import java.util.Iterator;

import java.util.List;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.content.Context;

import android.telephony.CellLocation;

import android.telephony.NeighboringCellInfo;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

import android.telephony.gsm.GsmCellLocation;

import android.util.Log;

public class CellInfoManager {

	private int asu;

	private int bid;

	private int cid;

	private boolean isCdma;

	private boolean isGsm;

	private int lac;

	private int lat;

	private final PhoneStateListener listener;

	private int lng;

	private int mcc;

	private int mnc;

	private int nid;

	private int sid;

	private TelephonyManager tel;

	private boolean valid;

	private Context context;

	public CellInfoManager(Context paramContext) {

		this.listener = new CellInfoListener(this);

		tel = (TelephonyManager) paramContext.getSystemService(Context.TELEPHONY_SERVICE);

		this.tel.listen(this.listener, PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);

		context = paramContext;

	}

	public static int dBm(int i) {

		int j;

		if (i >= 0 && i <= 31)

			j = i * 2 + -113;

		else

			j = 0;

		return j;

	}

	public int asu() {

		return this.asu;

	}

	public int bid() {

		if (!this.valid)

			update();

		return this.bid;

	}

	public JSONObject cdmaInfo() {

		if (!isCdma()) {

			return null;

		}

		JSONObject jsonObject = new JSONObject();

		try {

			jsonObject.put("bid", bid());

			jsonObject.put("sid", sid());

			jsonObject.put("nid", nid());

			jsonObject.put("lat", lat());

			jsonObject.put("lng", lng());

		} catch (JSONException ex) {

			jsonObject = null;

			Log.e("CellInfoManager", ex.getMessage());

		}

		return jsonObject;

	}

	public JSONArray cellTowers() {

		JSONArray jsonarray = new JSONArray();

		int lat;

		int mcc;

		int mnc;

		int aryCell[] = dumpCells();

		lat = lac();

		mcc = mcc();

		mnc = mnc();

		if (aryCell == null || aryCell.length < 2) {

			aryCell = new int[2];

			aryCell[0] = cid;

			aryCell[1] = -60;

		}

		for (int i = 0; i < aryCell.length; i += 2) {

			try {

				int j2 = dBm(i + 1);

				JSONObject jsonobject = new JSONObject();

				jsonobject.put("cell_id", aryCell[i]);

				jsonobject.put("location_area_code", lat);

				jsonobject.put("mobile_country_code", mcc);

				jsonobject.put("mobile_network_code", mnc);

				jsonobject.put("signal_strength", j2);

				jsonobject.put("age", 0);

				jsonarray.put(jsonobject);

			} catch (Exception ex) {

				ex.printStackTrace();

				Log.e("CellInfoManager", ex.getMessage());

			}

		}

		if (isCdma())

			jsonarray = new JSONArray();

		return jsonarray;

	}

	public int cid() {

		if (!this.valid)

			update();

		return this.cid;

	}

	public int[] dumpCells() {

		int[] aryCells;

		if (cid() == 0) {

			aryCells = new int[0];

			return aryCells;

		}

		List<NeighboringCellInfo> lsCellInfo = this.tel.getNeighboringCellInfo();

		if (lsCellInfo == null || lsCellInfo.size() == 0) {

			aryCells = new int[1];

			int i = cid();

			aryCells[0] = i;

			return aryCells;

		}

		int[] arrayOfInt1 = new int[lsCellInfo.size() * 2 + 2];

		int j = 0 + 1;

		int k = cid();

		arrayOfInt1[0] = k;

		int m = j + 1;

		int n = asu();

		arrayOfInt1[j] = n;

		Iterator<NeighboringCellInfo> iter = lsCellInfo.iterator();

		while (true) {

			if (!iter.hasNext()) {

				break;

			}

			NeighboringCellInfo localNeighboringCellInfo = (NeighboringCellInfo) iter.next();

			int i2 = localNeighboringCellInfo.getCid();

			if ((i2 <= 0) || (i2 == 65535))

				continue;

			int i3 = m + 1;

			arrayOfInt1[m] = i2;

			m = i3 + 1;

			int i4 = localNeighboringCellInfo.getRssi();

			arrayOfInt1[i3] = i4;

		}

		int[] arrayOfInt2 = new int[m];

		System.arraycopy(arrayOfInt1, 0, arrayOfInt2, 0, m);

		aryCells = arrayOfInt2;

		return aryCells;

	}

	public JSONObject gsmInfo() {

		if (!isGsm()) {

			return null;

		}

		JSONObject localObject = null;

		while (true) {

			try {

				JSONObject localJSONObject1 = new JSONObject();

				String str1 = this.tel.getNetworkOperatorName();

				localJSONObject1.put("operator", str1);

				String str2 = this.tel.getNetworkOperator();

				if ((str2.length() == 5) || (str2.length() == 6)) {

					String str3 = str2.substring(0, 3);

					String str4 = str2.substring(3, str2.length());

					localJSONObject1.put("mcc", str3);

					localJSONObject1.put("mnc", str4);

				}

				localJSONObject1.put("lac", lac());

				int[] arrayOfInt = dumpCells();

				JSONArray localJSONArray1 = new JSONArray();

				int k = 0;

				int m = arrayOfInt.length / 2;

				while (true) {

					if (k >= m) {

						localJSONObject1.put("cells", localJSONArray1);

						localObject = localJSONObject1;

						break;

					}

					int n = k * 2;

					int i1 = arrayOfInt[n];

					int i2 = k * 2 + 1;

					int i3 = arrayOfInt[i2];

					JSONObject localJSONObject7 = new JSONObject();

					localJSONObject7.put("cid", i1);

					localJSONObject7.put("asu", i3);

					localJSONArray1.put(localJSONObject7);

					k += 1;

				}

			} catch (JSONException localJSONException) {

				localObject = null;

			}

		}

	}

	public boolean isCdma() {

		if (!this.valid)

			update();

		return this.isCdma;

	}

	public boolean isGsm() {

		if (!this.valid)

			update();

		return this.isGsm;

	}

	public int lac() {

		if (!this.valid)

			update();

		return this.lac;

	}

	public int lat() {

		if (!this.valid)

			update();

		return this.lat;

	}

	public int lng() {

		if (!this.valid)

			update();

		return this.lng;

	}

	public int mcc() {

		if (!this.valid)

			update();

		return this.mcc;

	}

	public int mnc() {

		if (!this.valid)

			update();

		return this.mnc;

	}

	public int nid() {

		if (!this.valid)

			update();

		return this.nid;

	}

	public float score() {

		float f1 = 0f;

		int[] aryCells = null;

		int i = 0;

		float f2 = 0f;

		if (isCdma()) {

			f2 = 1065353216;

			return f2;

		}

		if (isGsm()) {

			f1 = 0.0F;

			aryCells = dumpCells();

			int j = aryCells.length;

			if (i >= j)

				f2 = f1;

		}

		if (i <= 0) {

			return 1065353216;

		}

		int m = aryCells[i];

		for (i = 0; i < m; i++) {

			if ((m < 0) || (m > 31))

				f1 += 0.5F;

			else

				f1 += 1.0F;

		}

		f2 = f1;

		return f2;

	}

	public int sid() {

		if (!this.valid)

			update();

		return this.sid;

	}

	public void update() {

		this.isGsm = false;

		this.isCdma = false;

		this.cid = 0;

		this.lac = 0;

		this.mcc = 0;

		this.mnc = 0;

		CellLocation cellLocation = this.tel.getCellLocation();

		int nPhoneType = this.tel.getPhoneType();

		if (nPhoneType == 1 && cellLocation instanceof GsmCellLocation) {

			this.isGsm = true;

			GsmCellLocation gsmCellLocation = (GsmCellLocation) cellLocation;

			int nGSMCID = gsmCellLocation.getCid();

			if (nGSMCID > 0) {

				if (nGSMCID != 65535) {

					this.cid = nGSMCID;

					this.lac = gsmCellLocation.getLac();

				}

			}

		}

		try {

			String strNetworkOperator = this.tel.getNetworkOperator();

			int nNetworkOperatorLength = strNetworkOperator.length();

			if (nNetworkOperatorLength != 5) {

				if (nNetworkOperatorLength != 6)

					;

			} else {

				this.mcc = Integer.parseInt(strNetworkOperator.substring(0, 3));

				this.mnc = Integer.parseInt(strNetworkOperator.substring(3, nNetworkOperatorLength));

			}

			if (this.tel.getPhoneType() == 2) {

				this.valid = true;

				Class<?> clsCellLocation = cellLocation.getClass();

				Class<?>[] aryClass = new Class[0];

				Method localMethod1 = clsCellLocation.getMethod("getBaseStationId", aryClass);

				Method localMethod2 = clsCellLocation.getMethod("getSystemId", aryClass);

				Method localMethod3 = clsCellLocation.getMethod("getNetworkId", aryClass);

				Object[] aryDummy = new Object[0];

				this.bid = ((Integer) localMethod1.invoke(cellLocation, aryDummy)).intValue();

				this.sid = ((Integer) localMethod2.invoke(cellLocation, aryDummy)).intValue();

				this.nid = ((Integer) localMethod3.invoke(cellLocation, aryDummy)).intValue();

				Method localMethod7 = clsCellLocation.getMethod("getBaseStationLatitude", aryClass);

				Method localMethod8 = clsCellLocation.getMethod("getBaseStationLongitude", aryClass);

				this.lat = ((Integer) localMethod7.invoke(cellLocation, aryDummy)).intValue();

				this.lng = ((Integer) localMethod8.invoke(cellLocation, aryDummy)).intValue();

				this.isCdma = true;

			}

		} catch (Exception ex) {

			Log.e("CellInfoManager", ex.getMessage());

		}

	}

	class CellInfoListener extends PhoneStateListener {

		CellInfoListener(CellInfoManager manager) {

		}

		public void onCellLocationChanged(CellLocation paramCellLocation) {

			CellInfoManager.this.valid = false;

		}

		public void onSignalStrengthChanged(int paramInt) {

			CellInfoManager.this.asu = paramInt;

		}

	}

}